package com.hk.service.product;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import com.hk.commons.HqlFilter;
import com.hk.commons.entity.FundInfo_Yimi;
import com.hk.commons.entity.product.ProductInfo;
import com.hk.commons.vo.CheckInfo;
import com.hk.commons.vo.OrderActCheckMsg;
import com.hk.commons.vo.ProductInfoRes;

public interface IProductInfo {
	public ProductInfo findById(long id);

	public Integer getBuyNum(Long userId,  Long parId  );

	/**
	 * 保存
	 * 
	 * @param u
	 * @return
	 */
	public Long add(ProductInfo u);

	/**
	 * 删除
	 * 
	 * @param
	 * @return
	 */
	public void delete(ProductInfo u);

	public void merge(ProductInfo u);

	/**
	 * 产品分页
	 * @param pageNo
	 * @param pageSize
	 * @param list
	 * @return
	 * @throws Exception
	 */
	public List<ProductInfo> page(int pageNo, int pageSize, List<ProductInfo> list);


	/**
	 * 删除排序
	 * @param sequence
	 */
	public void moveSequence(int sequence);

	/**
	 * 更新
	 * 
	 * @param
	 */
	public void update(ProductInfo u);

	public List<ProductInfo> findByFilter(HqlFilter hqlFilter, int pageNum,
			int pageSize);

	public List<ProductInfo> findByFilter(HqlFilter hqlFilter);

	public Long countByFilter(HqlFilter hqlFilter);

	/**
	 * 更改预约金额
	 * 
	 * @param bespeakAmount
	 * @return
	 */
	public boolean addBespeakAccount(Long id, BigDecimal bespeakAmount);

	public boolean addYraiseAccount(Long id, BigDecimal bespeakAmount);

	/**
	 * 根据支付信息改变产品的剩余额度和已募集额度
	 * @param id
	 * @param amount
	 * @param payStatus
	 * @return
	 */
	public  boolean updAmountByPay(Long id, BigDecimal amount, Boolean payStatus);

	/**
	 * 根据条件获取产品
	 * @param companyId
	 * @param proTerm
	 * @param maxYearRate
	 * @return
	 */
	public ProductInfo getByInfo(Integer companyId, Integer proTerm,
			BigDecimal maxYearRate);


	 /**
	 * 获取产品收益
	 * @param prod
	 * @param amount
	 * @return
	 */
	public BigDecimal getProDividend(ProductInfo prod, BigDecimal amount);

	/**
	 * 获取产品加息收益
	 * @param prod
	 * @param userCardId
	 * @param amount
	 * @return
	 */
	public BigDecimal getExtDividend(ProductInfo prod, Long userCardId,
			BigDecimal amount);
	/**
	 * 获取产品加息收益
	 * @param prod
	 * @param rate
	 * @param amount
	 * @return
	 */
	public BigDecimal getExtDividend(ProductInfo prod, BigDecimal rate,
			BigDecimal amount);

	/**
	 * 获取产品起息日和到期日
	 * 
	 * @param prod
	 * @return
	 */
	public Map<String, Long> getOrderDate(ProductInfo prod);

	public Integer validateRaiseMoney(ProductInfo productInfo, BigDecimal amount);

	/**
	 * 检查是否超过最多限购次数
	 * @param userId
	 * @param productId
	 * @return
	 */
	public CheckInfo checkLimit(Long userId, Long productId, BigDecimal byAmount);

	/**
	 * 判断能否使用加息券、体验金等
	 * @param userCardId
	 * @param productId
	 * @return
	 */
	public CheckInfo checkBeforeCreateOrder(Long userId, Long productId, BigDecimal byAmount, Long userCardId, String nowVersion);


	/**
	 * 活动相关的检查
	 * @param userId
	 * @param productId
	 * @param byAmount
     * @return
     */
	public OrderActCheckMsg checkAct(Long userId, Long productId, BigDecimal byAmount);

	//获取总收益 8% + 0.2%
	public String getTotalRateStr(Long productId);

	//获取总收益 0。082
	public BigDecimal getTotalRate(Long productId);



	//获取加息收益
	public BigDecimal getAddRate(Long productId);

	//确认购买日期是否是特殊日期
	public Boolean checkUnNormalDay( );

	//检查用户购买权限
	public CheckInfo canBuy(Long userId);

	//产品回款划拨添加日志
	public void  addLogRecord(Long productId, Long userId);

	public CheckInfo checkProdBuyVersion(String nowVersion, String limitVersion,  Long productId, Long userId);

	public CheckInfo checkProdBuyKyc(Long productId, Long userId);

	//获取产品关联的合同ID列表
	public List<Long> getAgreementIds(Long productId);

	/**
	 * 根据产品Id获取产品信息并填充到ProductInfoRes
	 * @param productId
	 * @return
	 */
	public ProductInfoRes getProductInfoResById(Long productId);


}
